<template>
  <div class="cart">
    <div class="header">
      <h1>我的购物车</h1>
    </div>
    
    <div v-if="cartItems.length === 0" class="empty-cart">
      <el-empty description="购物车还是空的，快去添加商品吧！" />
      <el-button type="primary" @click="goShopping">去购物</el-button>
    </div>
    
    <div v-else class="cart-content">
      <el-table
        :data="cartItems"
        style="width: 100%"
        :default-sort="{ prop: 'id', order: 'descending' }"
      >
        <el-table-column prop="name" label="商品名称" width="200" />
        <el-table-column prop="price" label="单价" width="100">
          <template #default="scope">
            ¥{{ scope.row.price.toFixed(2) }}
          </template>
        </el-table-column>
        <el-table-column label="数量" width="180">
          <template #default="scope">
            <el-input-number
              v-model="scope.row.quantity"
              :min="1"
              :max="scope.row.stock"
              @change="handleQuantityChange(scope.row)"
            />
          </template>
        </el-table-column>
        <el-table-column label="小计" width="100">
          <template #default="scope">
            ¥{{ (scope.row.price * scope.row.quantity).toFixed(2) }}
          </template>
        </el-table-column>
        <el-table-column label="操作" width="100">
          <template #default="scope">
            <el-button type="danger" text @click="removeFromCart(scope.row.id)">
              删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
      
      <div class="cart-summary">
        <div class="total-amount">
          合计：¥{{ totalAmount.toFixed(2) }}
        </div>
        <div class="summary-actions">
          <el-button @click="clearCart">清空购物车</el-button>
          <el-button type="primary" size="large" @click="goToCheckout">
            去结算
          </el-button>
        </div>
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, computed, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useCartStore } from '../store'
import { useUserStore } from '../store'

const router = useRouter()
const cartStore = useCartStore()
const userStore = useUserStore()

// 购物车商品列表
const cartItems = computed(() => cartStore.items)

// 计算总金额
const totalAmount = computed(() => {
  return cartItems.value.reduce((total, item) => {
    return total + (item.price * item.quantity)
  }, 0)
})

// 加载购物车数据
const loadCartItems = async () => {
  try {
    if (userStore.isAuthenticated) {
      // 登录状态从store加载购物车
      cartStore.loadCart()
    } else {
      // 未登录时从localStorage获取
      cartStore.loadCart()
    }
  } catch (error) {
    console.error('加载购物车失败:', error)
    
    // 根据错误类型提供更友好的错误提示
    if (error.response) {
      // 服务器返回的错误
      switch (error.response.status) {
        case 401:
          ElMessage.error('登录已过期，请重新登录')
          // 显示登录对话框，而不是自动跳转
          ElMessageBox.confirm('登录已过期，是否重新登录？', '提示', {
            confirmButtonText: '去登录',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            router.push('/login')
          }).catch(() => {
            // 用户选择不登录，不做任何操作
          })
          break
        case 403:
          ElMessage.error('无权限访问购物车')
          break
        case 500:
          ElMessage.error('服务器错误，请稍后再试')
          break
        default:
          ElMessage.error(`加载购物车失败: ${error.response.data.message || '未知错误'}`)
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应
      ElMessage.error('网络错误，请检查网络连接')
    } else {
      // 请求设置出错
      ElMessage.error(`加载购物车失败: ${error.message}`)
    }
  }
}

// 处理数量变化
const handleQuantityChange = async (cartItem) => {
  try {
    if (userStore.isAuthenticated) {
      // 登录状态更新store中的购物车
      cartStore.updateQuantity(cartItem.id, cartItem.quantity)
    } else {
      // 未登录时更新store中的购物车，会自动保存到localStorage
      cartStore.updateQuantity(cartItem.id, cartItem.quantity)
    }
    ElMessage.success('购物车已更新')
  } catch (error) {
    console.error('更新购物车失败:', error)
    
    // 处理401错误
    if (error.statusCode === 401) {
      ElMessage.error('登录已过期，请重新登录')
      ElMessageBox.confirm('登录已过期，是否重新登录？', '提示', {
        confirmButtonText: '去登录',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        router.push('/login')
      }).catch(() => {
        // 用户选择不登录，不做任何操作
      })
    } else {
      ElMessage.error('更新购物车失败')
    }
    
    // 恢复之前的数量
    loadCartItems()
  }
}

// 从购物车移除商品
const removeFromCart = async (cartItemId) => {
  try {
    if (userStore.isAuthenticated) {
      // 登录状态从store中移除
      cartStore.removeFromCart(cartItemId)
    } else {
      // 未登录时从store中移除，会自动更新localStorage
      cartStore.removeFromCart(cartItemId)
    }
    ElMessage.success('商品已移除')
  } catch (error) {
    console.error('移除商品失败:', error)
    
    // 处理401错误
    if (error.statusCode === 401) {
      ElMessage.error('登录已过期，请重新登录')
      ElMessageBox.confirm('登录已过期，是否重新登录？', '提示', {
        confirmButtonText: '去登录',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        router.push('/login')
      }).catch(() => {
        // 用户选择不登录，不做任何操作
      })
    } else {
      ElMessage.error('移除商品失败')
    }
  }
}

// 清空购物车
const clearCart = async () => {
  try {
    if (userStore.isAuthenticated) {
      // 登录状态清空store中的购物车
      cartStore.clearCart()
    } else {
      // 未登录时清空store中的购物车，会自动更新localStorage
      cartStore.clearCart()
    }
    ElMessage.success('购物车已清空')
  } catch (error) {
    console.error('清空购物车失败:', error)
    
    // 处理401错误
    if (error.statusCode === 401) {
      ElMessage.error('登录已过期，请重新登录')
      ElMessageBox.confirm('登录已过期，是否重新登录？', '提示', {
        confirmButtonText: '去登录',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        router.push('/login')
      }).catch(() => {
        // 用户选择不登录，不做任何操作
      })
    } else {
      ElMessage.error('清空购物车失败')
    }
  }
}

// 去购物
const goShopping = () => {
  router.push('/products')
}

// 去结算
const goToCheckout = () => {
  if (!userStore.isAuthenticated) {
    ElMessage.warning('请先登录')
    // 不自动跳转到登录页，而是让用户决定
    ElMessageBox.confirm('请先登录后再结算', '提示', {
      confirmButtonText: '去登录',
      cancelButtonText: '取消',
      type: 'warning'
    }).then(() => {
      router.push('/login')
    }).catch(() => {
      // 用户选择不登录，不做任何操作
    })
    return
  }
  
  // 保存购物车信息到localStorage，然后跳转到订单确认页面
  localStorage.setItem('checkoutCart', JSON.stringify(cartStore.items))
  router.push('/order/confirm')
}

// 页面加载时初始化数据
onMounted(() => {
  loadCartItems()
})
</script>

<style scoped>
.cart {
  max-width: 1200px;
  margin: 0 auto;
  padding: 20px;
}

.header {
  margin-bottom: 30px;
}

.header h1 {
  font-size: 28px;
  margin-bottom: 20px;
}

.empty-cart {
  text-align: center;
  padding: 60px 0;
}

.empty-cart .el-button {
  margin-top: 20px;
}

.cart-content {
  background-color: #fff;
  border-radius: 8px;
  padding: 20px;
  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}

.cart-summary {
  margin-top: 20px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 20px;
  background-color: #f5f5f5;
  border-radius: 8px;
}

.total-amount {
  font-size: 20px;
  font-weight: bold;
  color: #ff4d4f;
}

.summary-actions {
  display: flex;
  gap: 20px;
}
</style>